package cn.mesmile.juc.assist.cyclicbarrier;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @author zb
 * @date 2021/8/17 11:20
 * @Description
 */
public class CyclicBarrierDemo {

    /**
     * CyclicBarrier 看英文单词可以看出大概就是循环阻塞的意思，在使用中CyclicBarrier 的构造方法第一个参数是目标障碍数，
     * 每次执行 CyclicBarrier 一次障碍数会加一，如果达到了目标障碍数，才会执行 cyclicBarrier.await()之后的语句。
     * 可以将 CyclicBarrier 理解为加 1 操作
     */
    public static void main(String[] args) {
        int number = 7;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(number, new Runnable() {
            @Override
            public void run() {
                // 最后执行
                System.out.println("------>：集齐7个龙珠，召唤神龙");
            }
        });

        for (int i = 0; i < 7; i++) {
            new Thread(() ->{
                String threadName = Thread.currentThread().getName();
                System.out.println("当前线程的名字："+ threadName);
                if ("龙珠3号".equals(threadName)){
                    System.out.println("龙珠3号,暂停中");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("龙珠3号,苏醒了");
                    // 这里抛出异常，会导致  cyclicBarrier.await(); 阻塞，从而无法完成程序
//                    throw new RuntimeException("中途抛出异常");
                }
                try {
                    // 放在线程内，当次数满足的时候，就会执行 cyclicBarrier 中的内容
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },"龙珠"+i+"号").start();
        }
    }

}
